package api;

import com.fasterxml.jackson.databind.ObjectMapper;
import model.Blog;
import model.BlogDao;
import model.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.List;


//添加注解
@WebServlet("/blog")
public class BlogServlet extends HttpServlet {

    private ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp);

        // 检测是登录详情页还是列表页

        //req.setCharacterEncoding("utf8");
        //尝试获取一下queryString中 blogId字段
        String blogId = req.getParameter("blogId");
        BlogDao blogDao = new BlogDao();
        if(blogId == null) {
            // queryString 不存在，说明这次请求是 博客列表页
            // 此处我们通过有无 queryString 来判断，请求的是博客列表页还是博客详情页
            //从数据库中拿取所有列表的数据
            List<Blog> blogList = blogDao.selectAll();
            // 将 java 对象blogList转换成符合要求的 json  格式
            String respJson = objectMapper.writeValueAsString(blogList);
            //注意需要指定返回给浏览器的内容设置字符集
            resp.setContentType("application/json; charset=utf8");
            // 将数据返回给浏览器
            resp.getWriter().write(respJson);
        } else {
            // queryString 存在，说明请求的是博客详情页
            // 需要说明的是 getParameter 获取到的字段都是字符串，需要转成int 类型
            Blog blog = blogDao.selectById(Integer.parseInt(blogId));
            if(blog == null) {
                System.out.println("当前blogId = " + blogId + " 对应的博客不存在");
                return;
            }

            // 将 java 对象blog 转换成我们之前约定好的的 json 格式，那么前端 jackson 可以自动把json格式的字符串 解析成js对象，就可以操作了
            String respJson = objectMapper.writeValueAsString(blog);
            //注意需要指定返回给浏览器的内容设置字符集
            resp.setContentType("application/json; charset=utf8");
            // 将数据返回给浏览器
            resp.getWriter().write(respJson);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doPost(req, resp);

        // 发布博客，会访问到这个路径的这个方法

        // 读取请求(我们约定，请求中会发送过来文章标题和内容)，构造blog对象，插入到数据库中即可
        // 获取到标题和内容
        // 注意此处需要告诉 servlet ，按哪种字符集来理解请求，不然很容易发生乱码

        req.setCharacterEncoding("utf8");

        String title = req.getParameter("title");
        String content = req.getParameter("content");

        // 判断文章内容和标题是否为空
        if(title == null || "".equals(title) || content == null || "".equals(content)) {
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("标题或内容为空");
            return;
        }

        HttpSession session = req.getSession(false);
        if(session == null) {
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("当前未登录");
            return;
        }
        // 拿到登录的作者，这个就是发布文章的作者
        User user = (User) session.getAttribute("user");

        // 注意拿到 user 之后，还需要进行一下判断，检测用户是否登录，
        // 因为可能用户会通过构造query string，来直接访问
        if(user == null) {
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("当前未登录");
            return;
        }

        // 确保登录之后， 再有后续的，可以拿到作者
        // 构造blog对象，插入到数据库中即可
        BlogDao blogDao = new BlogDao();
        Blog blog = new Blog();
        // blogId是自增主键，不用设置
        blog.setTitle(title);
        blog.setContent(content);
        // 注意是 setUserId ， 不是 setBlogId ， 找好对应的关系
        blog.setUserId(user.getUserId());
        // new Timestamp(System.currentTimeMillis())
        // 发布时间, 在 java 中生成 / 数据库中生成 都行
        blog.setPostTime(new Timestamp(System.currentTimeMillis()));
        // 插入到数据库
        blogDao.add(blog);

        // 之后跳转到博客列表页
        resp.sendRedirect("blog_list.html");
    }
}
